與其說是技術文,比較像是技術翻譯文...
影片:https://www.youtube.com/watch?v=Y4dtUOOqRWE&list=PLrzrNeNx3kNHsaPfrpPo0AlW-MhJE6gOA&index=11
另一種可以create javascript的方法就是用create()方法(method),這是ECMAscript5的規格
var foo = {};
var bar = Object.create(Object.prototype);
//這寫法比實字(literal)寫法長多了,但他的功能可厲害惹
這個功能那就是 --
來舉個比較複雜的例子,有一個名叫johnDoe的物件
var johnDoe = {
firstName: "John",
lastName: "Doe",
sayName: function() {
return "My name is" + this.firstName + " " + this.lastName;
}
};
技術上來說,javascript沒有method(方法),他是property(屬性)擁有一個function物件
所以接下來所說的method就是指這種屬性裡含有function的作法
接下來我們來創造一個janeDoe物件,同樣也擁有firstName和lastName屬性和sayName方法
除了直接複製貼上外,就是要來使用今天講的create方法,並以johnDoe物件為基礎
馬上來創造一個variable(變數),名為janeDoe
因為我們希望新的物件裡,firstName為"Jane",因為他們同姓且也都需要一個sayName,
所以現在僅需要改firstName的部分
那麼應該怎麼改呢?
var janeDoe = Object.creat(johnDoe, {
firstName: { value: "Jane" }
});
//第二個argument(參數)便是打入你要更改使用的property以及其值(object descriptor物件描述符號)
現在把他們印出來
alert(johnDoe.sayName());
//跳出視窗"My name is Jahn Doe"
alert(janeDoe.sayName());
//跳出視窗"My name is Jane Doe"
我們來試試在janeDoe物件裡加入新的屬性/方法,名為greet:
var janeDoe = Object.creat(johnDoe, {
firstName: { value: "Jane" },
greet: function(name){
return "Hello," + name;
}
});
這個greet方法只給janeDoe物件,johnDoe則維持原樣
接下來再建一個叫jimSimth的物件,並以janeDoe物件為基礎
把三個都寫齊如下:
var johnDoe = {
firstName: "John",
lastName: "Doe",
sayName: function() {
return "My name is" + this.firstName + " " + this.lastName;
}
};
var janeDoe = Object.create(johnDoe, {
firstName: { value: "Jane" },
greet: function(person){
return "Hello," + person.firstName;
}
});
var jimSmith = Object.create(janeDoe, {
firstName: { value: "Jim" },
lastName: { value:"Smith" }
});
//這次firstName跟lastName都要改
現在來印出來試試看
alert(johnDoe.sayName());
//視窗跳出"My Name is John Doe"
alert(janeDoe.sayName() + "" + janeDoe.greet(johnDoe));
//沒跳出來
alert(jimSmith.sayName() + "" + jimSmith.greet(janeDoe));
//沒跳出來
//chrome console: Uncaught TypeError: Property 'greet' of object #<Object> is not a function
哈哈,出現一個我沒看過的錯誤
要怎麼改呢?
var johnDoe = {
firstName: "John",
lastName: "Doe",
sayName: function() {
return "My name is" + this.firstName + " " + this.lastName;
}
};
var janeDoe = Object.create(johnDoe, {
firstName: { value: "Jane" },
greet: {
value : function(person){
return "Hello," + person.firstName;
}
}
});
//原來是greet屬性要使用object descriptor物件描述符號方式來寫
var jimSmith = Object.create(janeDoe, {
firstName: { value: "Jim" },
lastName: { value:"Smith" }
});
印出來:
alert(johnDoe.sayName());
//視窗跳出"My Name is John Doe"
alert(janeDoe.sayName() + "" + janeDoe.greet(johnDoe));
//視窗跳出"My name is Jane Doe Hello, John"
alert(jimSmith.sayName() + "" + jimSmith.greet(janeDoe));
//視窗跳出"My name is Jim Smith Hello, Jane"
原理是什麼呢?
Object.create()所做的是建立一個prototype chain(原型鏈)
所以在create method括號中的第一個參數就是在你要的新物件上設定的protoype
因此我們可以說janeDoe的prototype就是johnDoe,jimSmith的prototype就是janeDoe
驗證一下
console.log(janeDoe.__proto__ === johnDoe);
//console印出"true"
console.log(jimSmith.__proto__ === janeDoe);
//console印出"true"
不過事實上我們寫code不會想要一直用create method
還是會使用物件實字的方法,用同樣的介面(都一樣有firstName, lastName, sayName,另一個物件有greet
$#@^T#%@$@#(有一段聽不太懂)
另一種pattern叫做constructor, 這也是下個部分會講的
學到的單字:
incept 取得
inception 全面啟動
terminology 術語
第三十天了...小小的感傷
為了寫技術文,早早8點半就在電腦前準備
雖然中間一直不斷的分心,但還是終於聽完了,很喜歡這個系列,只有短短的五分鐘
正適合英文還需要加強的我聽,5分鐘也正好是我能聽完的時間
之後會繼續看完它並寫筆記,本來是寫這篇之前希望開好網誌來告訴大家,不過還沒準備好只好做罷
相信有緣還會相見,然後現在其實有點無法想像我已經寫滿30天了,時間過的真快,
這三十天來的心得,前幾篇多多少少都有寫過了,從一開始就是希望養成寫文的習慣,到今日也算完成半個願望了
接下來就是在非強迫的情況下還能繼續寫文
未來會把這裡寫過的文章稍微整理一下,改一改,把不錯的文章放在自己的網誌裡
很喜歡寫文的感覺,莫忘現在的感覺阿!!
大家一起在coding的路上發光發熱吧!!